#ifndef _APP_MOTION_CONTROL_H
#define _APP_MOTION_CONTROL_H

#include "common.h"

// 本四轴飞行器运动参考笛卡尔坐标系，飞行器中心位于坐标原点，以y轴正方向为飞行正向
// 飞行器y轴正半轴部分向z轴正方向翻转，俯仰角为正值
// 飞行器x轴正半轴部分向z轴正方向翻转，横滚角为正值
// 飞行器以z轴为轴心，俯视顺时针方向转动，偏航角为正值
// 飞行器各电机序号如下：
//		|
//	1 	|	0
//--------------
//	2	|	3
//		|

// 姿态控制结构体
typedef struct _posture_control_t
{
	int16 expc_pitch_angle;	// 期望俯仰角度
	int16 expc_roll_angle;	// 期望横滚角度
	int16 expc_yaw_angle;	// 期望偏航角度
	
	int16 cur_pitch_angle;	// 当前俯仰角度
	int16 cur_roll_angle;	// 当前横滚角度
	int16 cur_yaw_angle;	// 当前偏航角度
	
	int16 expc_pitch_gyro; 	// 期望俯仰角速度
	int16 expc_roll_gyro;	// 期望横滚角速度
	int16 expc_yaw_gyro;	// 期望偏航角速度
	
	int16 cur_pitch_gyro;	// 当前俯仰角速度
	int16 cur_roll_gyro;	// 当前横滚角速度
	int16 cur_yaw_gyro;		// 当前偏航角速度
} posture_control_t;

// 电机控制结构体
typedef struct _motor_control_t
{
	int16 motor_total[4];	// 电机总PWM输出
	int16 motor_pwm_basic;	// PWM基础输出
	int16 motor_pwm_limit;	// PWM限幅
} motor_control_t;


// 运动控制结构体
typedef struct _motion_control_t
{
	enum _state {
		STOP,			// 停止
		WAIT,			// 等待起飞
		AUTO_CTRL,		// 自动控制
		REMOTE_CTRL,	// 遥控控制
	} state;
	
	posture_control_t posture_control;	// 姿态控制
	motor_control_t motor_control;		// 电机控制
} motion_control_t;


extern motion_control_t g_motion_control;
void motion_control(uint32 timer_frequency); // 运动控制（此函数用于定时器中断中）

#endif
